<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ruteo URI : Gu&iacute;a del Usuario de CodeIgniter</title>

<style type='text/css' media='all'>@import url('../userguide.css');</style>
<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' />

<script type="text/javascript" src="../nav/nav.js"></script>
<script type="text/javascript" src="../nav/prototype.lite.js"></script>
<script type="text/javascript" src="../nav/moo.fx.js"></script>
<script type="text/javascript" src="../nav/user_guide_menu.js"></script>

<meta http-equiv='expires' content='-1' />
<meta http-equiv= 'pragma' content='no-cache' />
<meta name='robots' content='all' />
<meta name='author' content='ExpressionEngine Dev Team' />
<meta name='description' content='Gu&iacute;a del Usuario de CodeIgniter' />

</head>
<body>

<!-- START NAVIGATION -->
<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div>
<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Mostrar Tabla de Contenido" alt="Mostrar Tabla de Contenido" /></a></div>
<div id="masthead">
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr>
<td><h1>Gu&iacute;a del Usuario de CodeIgniter Versi&oacute;n 2.1.1</h1></td>
<td id="breadcrumb_right"><a href="../toc.html">Tabla de Contenido</a></td>
</tr>
</table>
</div>
<!-- END NAVIGATION -->


<!-- START BREADCRUMB -->
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr>
<td id="breadcrumb">
<a href="http://codeigniter.com/">CodeIgniter</a> &nbsp;&#8250;&nbsp;
<a href="../index.html">Gu&iacute;a del Usuario</a> &nbsp;&#8250;&nbsp;
Ruteo URI
</td>
<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="escodeigniter.com/guia_usuario/" />Buscar en la Gu&iacute;a del Usuario&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td>
</tr>
</table>
<!-- END BREADCRUMB -->

<br clear="all" />


<!-- START CONTENT -->
<div id="content">

<h1>Ruteo URI</h1>

<p>Tipicamente hay una relacion uno-a-uno entre una cadena URL y su correspondiente controlador clase/metodo. Los segmentos en una URI normalmente siguen este patron:</p>

<code>www.your-site.com/<dfn>class</dfn>/<samp>function</samp>/<var>id</var>/</code>

<p>En algunas instancias, sin embargo, querras remapear esta relaci&oacute;n para que una clase/funcion diferente pueda ser llamada en lugar de la correspondiente a la URL.</p>

<p>Por ejemplo, digamos que quieres que tus URLs tengan este prototipo:</p>

<p>
www.tu-sitio.com/product/1/<br />
www.tu-sitio.com/product/2/<br />
www.tu-sitio.com/product/3/<br />
www.tu-sitio.com/product/4/
</p>

<p>Normalmente el segundo segmento de la URL es reservada para el nombre de funcion, pero en este ejemplo en lugar de eso tiene el ID del producto. Para superar esto, CodeIgniter te permite remapear el manejador URI.</p>

<h2>Creando tus propias reglas de ruteo</h2>

<p>Las reglas de ruteo son definidas dentro de tu archivo <var>application/config/routes.php</var>. Dentro de el deberias poder ver un arreglo llamado <dfn>$route</dfn> que te permite especificar tus criterios de ruteo. Las rutas podrian ser especificadas utilizando <dfn>comodines</dfn> o <dfn> Expresiones Regulares</dfn></p>

<h2>Comodines</h2>

<p>Un tipico comodidin de ruteo deberia parecerse a esto:</p>

<code>$route['product/:num'] = "catalog/product_lookup";</code>

<p>En una ruta, la clave del arreglo contiene la URI que debe coincidir, mientras que el valor del arreglo contiene el destino a donde debe ser re-ruteado. En el ejemplo anterior, si el literalmente la palabra "product" es encontrada en el primer segmento de la URL, y el numero es encontrado en el segundo segmento, la clase "catalog" y el metodo "product_lookup" seran usados.</p>

<p>Puedes hacer que coincidan los valores literales, o puedes usar dos tipos de comodines:</p>

<p><strong>(:num)</strong> coincidira con un segmento que unicamente contiene numeros.<br />
<strong>(:any)</strong> coincidira con un segmento que contenga cualquier caracter.</p>

<p class="important"><strong>Nota:</strong>Las Rutas correran en el orden que sean definidas. Rutas superiores siempre tomaran precedencia sobre las que tienen menos precedencia.</p>

<h2>Ejemplos</h2>

<p>He aqui algunos ejemplos de ruteo:</p>

<code>$route['journals'] = "blogs";</code>
<p>Una URL  conteniendo la palabra "journals" en el primer segmento sera remapeada a la clase "blogs".</p>

<code>$route['blog/joe'] = "blogs/usuarios/34";</code>
<p>una URL conteniendo el segmento blog/joe sera remapead a la clase "blogs" y el metodo "users". El ID sera seteado a "34".</p>

<code>$route['product/:any'] = "catalog/producto_buscar";</code>
<p>Una  URL con "product" como el primer segmento, y cualquier cosa en el segundo sera remapeado a  la clase "catalog" y el metodo "product_lookup".</p>

<code>$route['producto/(:num)'] = "catalogo/producto_buscar_por_id/$1";</code>
<p>Una URL con "producto" como primer segmento y un n&uacute;mero en el segundo, se remapear&aacute; a la clase "catalogo" y al m&eacute;todo "producto_buscar_por_id" pas&aacute;ndole una variable a la funci&oacute;n.</p>

<p class="important"><strong>Importante:</strong> No use barras al comienzo/final.</p>

<h2>Expresiones Regulares</h2>

<p>Si lo prefieres, puedes utilizar expresiones regulares para definir tus reglas de ruteo. Cualquier expresion regular es permitida, como lo son  las back-references.</p>

<p class="important"><strong>Note:</strong>&nbsp; Si usa back-references debes usar la sintaxis de dolares antes que la sintaxis de doble barra diagonal.</p>

<p>Una tipica Expresion Regular deberia parecerse a esto:</p>

<code>$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";</code>

<p>En el ejemplo anterior, una URI similar a <dfn>products/shirts/123</dfn> llamara en su lugar a la clase controlador <dfn>shirts</dfn> y la funcion <dfn>id_123</dfn>.</p>

<p>Tambien puedes mesclar comodines con expresiones regulares.</p>

<h2>Rutas Reservadas</h2>

<p>Hay dos rutas reservadas:</p>

<code>$route['default_controller'] = 'welcome';</code>

<p>Esta ruta indica cual clase controlador debera ser cargado si la URI no contiene datos, caso que ocurrira cuando la gente cargue la URL raiz. En el ejemplo anterior, la clase "welcome" seria la que se cargue. Te animamos a que siempre tengas una ruta por defecto,  caso contrario una pagina 404 apareceria por defecto.</p>



<code>$route['404_override'] = '';</code>
<p>Esta ruta indica cual clase controlador debera ser cargada si el controlador solicitado no se encuentra. Se anular&aacute; la p&aacute;gina de error 404 por defecto. No afectar&aacute; a la funci&oacute;n <samp>show_404()</samp>, que seguir&aacute; cargando el archivo por defecto <dfn>error_404.php</dfn> en <var>application/errors/error_404.php</var>.</p>


<p class="important"><strong>Importante:</strong>&nbsp; Las rutas reservadas deben aparecer antes que cualquier comodin o expresion regular de ruteo.</p>
</div>
<!-- END CONTENT -->


<div id="footer">
<p>
Tema anterior:&nbsp;&nbsp;<a href="common_functions.html">Funciones Comunes</a>
&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="#top">Subir</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="../index.html">Gu&iacute;a del Usuario</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
Pr&oacute;ximo tema:&nbsp;&nbsp;<a href="errors.html">Manejo de Errores</a>
</p>
<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2011 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a></p>
</div>

</body>
</html>